const mongoose = require('mongoose')

// 医生信息表
const doctorSchema = new mongoose.Schema({
    // 医生姓名
    Doctorname: {
        type: String,
        required: [true, '医生姓名是必填项'],
        trim: true,
        maxlength: [50, '医生姓名不能超过50个字符']
    },
    // 医生头像
    avatar: {
        type: String,
        default: 'http://127.0.0.1:8088/default-avatar.jpg',
        validate: {
            validator: function(v) {
                // 如果值为空，允许通过（使用默认值）
                if (!v) return true;
                
                // 必须是字符串类型
                if (typeof v !== 'string') {
                    return false;
                }
                
                // 检查是否是有效的URL格式
                try {
                    new URL(v);
                    return true;
                } catch (e) {
                    // 如果不是完整URL，检查是否是相对路径
                    return v.startsWith('/') || v.startsWith('http://') || v.startsWith('https://');
                }
            },
            message: '头像必须是有效的URL字符串'
        }
    },
    // 院区
    Courtyardarea: {
        type: String,
        enum: {
            values: ['东院', '西院', '南院', '北院', '总院'],
            message: '院区必须是以下之一：东院、西院、南院、北院、总院'
        },
        default: '总院'
    },
    // 职称
    Doctorjob: {
        type: String,
        enum: {
            values: ['主任医师', '副主任医师', '主治医师', '住院医师', '医师'],
            message: '职称必须是以下之一：主任医师、副主任医师、主治医师、住院医师、医师'
        },
        required: [true, '职称是必填项']
    },
    // 科室
    Department: {
        type: String,
        required: [true, '科室是必填项'],
        maxlength: [50, '科室名称不能超过50个字符']
    },
    // 专业标签
    Tags: {
        type: [String],
        default: [],
        validate: {
            validator: function(v) {
                return Array.isArray(v);
            },
            message: '专业标签必须是数组格式'
        }
    },
    // 医生简介
    Doctorcontent: {
        type: String,
        default: '',
        maxlength: [1000, '医生简介不能超过1000个字符']
    },
    // 联系电话
    phone: {
        type: String,
        validate: {
            validator: function(v) {
                return !v || /^1[3-9]\d{9}$/.test(v) || /^0\d{2,3}-?\d{7,8}$/.test(v);
            },
            message: '电话号码格式不正确，请输入有效的手机号或固话'
        }
    },
    // 邮箱
    email: {
        type: String,
        validate: {
            validator: function(v) {
                return !v || /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(v);
            },
            message: '邮箱格式不正确，请输入有效的邮箱地址'
        }
    },
    // 从业年限
    experience: {
        type: Number,
        min: [0, '从业年限不能为负数'],
        max: [100, '从业年限不能超过100年'],
        default: 0
    },
    // 学历
    education: {
        type: String,
        enum: {
            values: ['本科', '硕士', '博士', '博士后'],
            message: '学历必须是以下之一：本科、硕士、博士、博士后'
        },
        default: '本科'
    },
    // 擅长领域
    specialties: {
        type: [String],
        default: [],
        validate: {
            validator: function(v) {
                return Array.isArray(v);
            },
            message: '擅长领域必须是数组格式'
        }
    },
    // 工作状态
    status: {
        type: String,
        enum: {
            values: ['在职', '休假', '离职'],
            message: '工作状态必须是以下之一：在职、休假、离职'
        },
        default: '在职'
    },
    // 排班信息
    schedule: {
        type: {
            monday: { type: Boolean, default: false },
            tuesday: { type: Boolean, default: false },
            wednesday: { type: Boolean, default: false },
            thursday: { type: Boolean, default: false },
            friday: { type: Boolean, default: false },
            saturday: { type: Boolean, default: false },
            sunday: { type: Boolean, default: false }
        },
        default: {
            monday: false,
            tuesday: false,
            wednesday: false,
            thursday: false,
            friday: false,
            saturday: false,
            sunday: false
        },
        validate: {
            validator: function(v) {
                if (!v || typeof v !== 'object') return false;
                const requiredDays = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday'];
                return requiredDays.every(day => typeof v[day] === 'boolean');
            },
            message: '排班信息格式不正确，必须包含周一到周日的布尔值'
        }
    },
    // 挂号费
    registrationFee: {
        type: Number,
        min: [0, '挂号费不能为负数'],
        max: [10000, '挂号费不能超过10000元'],
        default: 0
    },
    // 医生创建时间
    time: {
        type: Date,
        default: Date.now
    },
    // 更新时间
    updateTime: {
        type: Date,
        default: Date.now
    }
}, {
    timestamps: true,
    collection: 'doctors'
});

// 更新时间中间件
doctorSchema.pre('save', function(next) {
    this.updateTime = new Date();
    next();
});

// 自定义错误处理
doctorSchema.post('save', function(error, doc, next) {
    if (error.name === 'ValidationError') {
        // 将英文的validation error转换为中文
        const errors = {};
        for (let field in error.errors) {
            errors[field] = error.errors[field].message;
        }
        const customError = new Error('医生数据验证失败');
        customError.name = 'ValidationError';
        customError.errors = errors;
        next(customError);
    } else {
        next(error);
    }
});

module.exports = mongoose.model('DoctorData', doctorSchema);







